package br.uniceub.fsw.academicmobile.dao;

import java.sql.*;
import java.util.ArrayList;
import br.uniceub.fsw.academicmobile.vo.DisciplinaVO;
import br.uniceub.fsw.academicmobile.vo.MaterialVO;
import br.uniceub.fsw.academicmobile.vo.TurmaVO;
import java.util.Iterator;
import java.util.List;

/**
 * Classe dao responsavel pela interacao de dados do material com o banco de dados.
 * @author Christian Miranda.
 */
public class MaterialDAO {

	private BD bd;

	public MaterialDAO() {
		bd = new BD();
	}

	/**
	 * Recebe o material e a disciplina a a qual ele sera associado e inclui no banco.
	 * @param material dados do material incluso pelo professor.
	 * @param disciplina a a qual o material sera associado.
	 * @return boolean true se o metodo conseguir realizar a inclusao.
	 */
	public boolean incluir(MaterialVO material,List turmas) {
		
		String SQL = "INSERT into tb_material (NO_material, LK_material) values (?, ?)";
		boolean retorno = true;
		try {
                    PreparedStatement ps = bd.getCn().prepareStatement(SQL);
                    ps.setString(1, material.getNoMaterial());
                    ps.setString(2, material.getLkMaterial());
                    ps.execute();
                    SQL = "SELECT * FROM tb_material WHERE NO_material =? AND LK_material = ?";
                    ps.close();
                    bd = new BD();
                    PreparedStatement ps2 = bd.getCn().prepareStatement(SQL);
                    ps2.setString(1, material.getNoMaterial());
                    ps2.setString(2, material.getLkMaterial());
                    ResultSet rs = ps2.executeQuery();
                    rs.next();
                    Integer id = rs.getInt("ID_material");
                    for(int i = 0; i < turmas.size();i++){
                        TurmaVO turma = (TurmaVO) turmas.get(i);
                        SQL = "Insert into tb_turma_material (tb_turma_ID_turma," +
                                "tb_material_ID_material) values (?,?)";
                        ps2.close();
                        PreparedStatement ps3 = bd.getCn().prepareStatement(SQL);
                        ps3.setInt(1, turma.getIdTurma());
                        ps3.setInt(2, id);
                        ps3.execute();
                    }
		} catch (SQLException ex) {
			retorno = false;
			System.err.println("MaterialDAO.incluir:"
					+ ex.getMessage());
		} catch (Exception e){
                    retorno = false;
                    e.getMessage();
                    e.printStackTrace();
                }
                

		return retorno;
	}
	
	/**
	 * Busca os materiais associados à turma a partir do id.
	 * @param turma Vo carregando o id da turma.
	 * @return ArrayList Lista de materiais MaterialVO.
	 */
	public ArrayList<MaterialVO> consultarMaterialPorTurma(TurmaVO turma){
		
		String SQL = "SELECT * FROM tb_turma_material WHERE tb_turma_ID_turma=<01>";
		SQL = SQL.replaceAll("<01>", turma.getIdTurma().toString());
		ArrayList aList = new ArrayList();
                Integer idMaterial;
                int i = 0;
		try {
			ResultSet rs = bd.getResultSet(SQL);
			while (rs.next()) {
                            idMaterial = rs.getInt("tb_material_ID_material");
                            String SQL2;
                            SQL2 = "SELECT * FROM tb_material WHERE ID_material = <01>";
                            i++;
                            SQL2 = SQL2.replaceAll("<01>", idMaterial.toString());
                            ResultSet rs2 = bd.getResultSet(SQL2);
                            if(rs2.next()){
                                MaterialVO m = new MaterialVO();
                                m.setIdMaterial(rs2.getInt("ID_material"));
                                m.setNoMaterial(rs2.getString("NO_material"));
                                m.setLkMaterial(rs2.getString("LK_material"));
                                aList.add(m);
                                }
			}
			rs.close();
		} catch (Exception ex) {
			System.err.println("MaterialDAO.consultarMaterialPorTurma:"
					+ ex.getMessage());
		}
		return aList;
	}
        
        /**
         * Retorna a lista de materiais relacionados às respectivas turmas
         * @param turmas lista contendo um conjunto de turmas
         * @return ArrayList contendo conjunto de materiais
         */
        public ArrayList consultarMateriaisPorTurmas(ArrayList turmas){
		Iterator itTurmas = turmas.iterator();
                ArrayList aList = new ArrayList();
                Integer idMaterial;
                ArrayList listaIds = new ArrayList();
                while(itTurmas.hasNext()){
                    TurmaVO turma = (TurmaVO) itTurmas.next();
                    String SQL = "SELECT * FROM tb_turma_material WHERE tb_turma_ID_turma=<01>";
                    SQL = SQL.replaceAll("<01>", turma.getIdTurma().toString());
                    try {
                            ResultSet rs = bd.getResultSet(SQL);
                            while (rs.next()) {
                                boolean diferente = true;
                                idMaterial = rs.getInt("tb_material_ID_material");
                                String SQL2;
                                for(int i = 0; i<listaIds.size();i++){
                                    if(idMaterial.equals((Integer) listaIds.get(i))){
                                       diferente = false;
                                    }
                                }
                                if(diferente){
                                    SQL2 = "SELECT * FROM tb_material WHERE ID_material = <01>";
                                    listaIds.add(idMaterial);
                                    SQL2 = SQL2.replaceAll("<01>", idMaterial.toString());
                                    ResultSet rs2 = bd.getResultSet(SQL2);
                                    if(rs2.next()){
                                        MaterialVO m = new MaterialVO();
                                        m.setIdMaterial(rs2.getInt("ID_material"));
                                        m.setNoMaterial(rs2.getString("NO_material"));
                                        m.setLkMaterial(rs2.getString("LK_material"));
                                        aList.add(m);
                                    }
                                }
                                
                            }
                            rs.close();
                    } catch (Exception ex) {
                            System.err.println("MaterialDAO.consultarMaterialPorTurma:"
                                            + ex.getMessage());
                    }
                }
		return aList;
	}
	
	/**
	 * Busca objeto MaterialVO pelo seu id.
	 * @param material Vo carregando o id do material.
	 * @return MaterialVO Vo carregando todos os dados do material.
	 */
	public MaterialVO consultarMaterialPorId(MaterialVO material){
		
		String SQL = "SELECT * FROM tb_material WHERE ID_material=<01>";
		SQL = SQL.replaceAll("<01>", material.getIdMaterial().toString());
		MaterialVO m = new MaterialVO();
		try {
			ResultSet rs = bd.getResultSet(SQL);
			if (rs.next()) {
				m.setIdMaterial(rs.getInt("ID_material"));
				m.setNoMaterial(rs.getString("NO_material"));
				m.setLkMaterial(rs.getString("LK_material"));
			}
			rs.close();
		} catch (Exception ex) {
			System.err.println("MaterialDAO.consultarMaterialPorId:"
					+ ex.getMessage());
		}
		return m;
	}
	
	/**
	 * Altera os dados do material no banco.
	 * @param material Vo carregando os dados do material a ser alterado.
         * @param turma VO carregando os dados da turma relacionada com o material.
	 * @return boolean True se o material for alterado com sucesso.
	 */
	public boolean alterar(MaterialVO material, ArrayList turmas){
            boolean retorno = true;
            String SQL = "DELETE FROM tb_turma_material WHERE tb_material_ID_material =?";
            
            try {
                PreparedStatement ps = bd.getCn().prepareStatement(SQL);
                ps.setInt(1, material.getIdMaterial());
                ps.execute();
            
                for(int i = 0; i < turmas.size();i++){
                    TurmaVO turma = (TurmaVO) turmas.get(i);
                    SQL = "Insert into tb_turma_material (tb_turma_ID_turma," +
                            "tb_material_ID_material) values (?,?)";
                    ps = bd.getCn().prepareStatement(SQL);
                    ps.setInt(1, turma.getIdTurma());
                    ps.setInt(2, material.getIdMaterial());
                    ps.execute();
                }
            
                SQL = "UPDATE tb_material SET NO_material=?, " +
                            "LK_material=? WHERE ID_material = ?";
                ps = bd.getCn().prepareStatement(SQL);
                ps.setString(1, material.getNoMaterial());
                ps.setString(2, material.getLkMaterial());
                ps.setInt(3, material.getIdMaterial());
                ps.execute();
            } catch (SQLException e) {
                retorno = false;
                e.printStackTrace();
            }
            return retorno;
	}

	/**
	 * Exclui os dados do material no banco.
	 * @param material Vo carregando o id do material a ser exclu�do.
	 * @return boolean True se o material for exclu�do com sucesso.
	 */
	public boolean excluir(MaterialVO material){
            boolean retorno = true;
            String SQL = "DELETE FROM tb_turma_material WHERE tb_material_ID_material =<01>";
            SQL = SQL.replaceAll("<01>", material.getIdMaterial().toString());
            if(!bd.execSQL(SQL)){
                retorno = false;
            }
            SQL = "DELETE FROM tb_material WHERE ID_material=<01>";
            SQL = SQL.replaceAll("<01>", material.getIdMaterial().toString());
            if(!bd.execSQL(SQL)){
                retorno = false;
            }
            return retorno;
	}
}
